[小ネタ]意図せずpackage-lock.jsonからプラットフォーム依存のパッケージが消えてCIが異常終了したので対応した話

[小ネタ]意図せずpackage-lock.jsonからプラットフォーム依存のパッケージが消えてCIが異常終了したので対応した話

Clock Icon2024.10.08

リテールアプリ共創部@大阪の岩田です。

package-lock.jsonを更新した直後からGitHub Actionsで実行しているCIジョブが異常終了するようになり、少しハマってしまったので情報共有のため経緯と対応方法をご紹介します。

経緯

今回問題となった事象ですが以下のような流れで発生しました。

  • mainブランチからfeatureブランチを切って作業を進める

    • featureブランチの作業でpackage.jsonpackage-lock.json を更新する
  • 作業中にmainブランチに別のPRがマージされ、この際mainブランチのpackage.jsonpackage-lock.json も更新される

  • 作業が完了したのでfeatureブランチをmainブランチにマージするPRを作成する

  • コンフリクトが発生していることに気付き、ローカル環境にてmainブランチをfeatureブランチにマージしてコンフリクトを解消

    • package.jsonのコンフリクト解消後、package-lock.jsonについては削除後にnpm installを行い再作成
  • コンフリクトが解消できたのでリモートのfeatureブランチにプッシュ

  • CIが自動実行されエラーが発生!!

発生したエラーは具体的には以下のようなエラーでした。GitHub Actionsのジョブの中でbiome checkを実行しているのですが、その際'@biomejs/cli-linux-x64/biomeが見つからずにエラーになっているようです。

> biome check ./

node:internal/modules/cjs/loader:1147
  throw err;
  ^

Error: Cannot find module '@biomejs/cli-linux-x64/biome'
Require stack:
- /home/runner/work/...略/node_modules/@biomejs/biome/bin/biome
    at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
    at Function.resolve (node:internal/modules/helpers:187:19)
    at Object.<anonymous> (/home/runner/work/...略/node_modules/@biomejs/biome/bin/biome:51:11)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)
    at node:internal/main/run_main_module:28:49 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/runner/work/...略/node_modules/@biomejs/biome/bin/biome'
  ]
}

ローカルの開発環境にはM2 Macを利用しているので、CI環境とのアーキテクチャの差異が何かしら悪さをしてそうです。

原因

mainブランチとfeatureブランチの内容を比較したところ、package-lock.jsonに以下のような差分が見つかりました。

-    "node_modules/@biomejs/cli-linux-x64": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz",
-      "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },

node_modules/@biomejs/biomeoptionalDependenciesに含まれるnode_modules/@biomejs/cli-linux-x64の記述が丸々消えてしまっています。

関連するメンバーの開発環境はすべてarm環境なので、単純にM2 Macでnpm installするのがダメということは無いはずです。なぜpackage-lock.jsonからx64環境向けのパッケージの記述が消えたんだ...と調べたところ、以下のissueを発見しました。

https://github.com/npm/cli/issues/4828

今回の事象に当てはめると、ローカル環境のnode_modules配下に@biomejs/biomeがインストール済みの状態でpackage-lock.jsonを削除後に再度npm installしてpackage-lock.jsonを再生成すると、node_modules配下に存在しないプラットフォーム依存のパッケージはpackage-lock.jsonに書き込まれないようです。

開発環境はM2 Macなので、node_modules/@biomejs/配下はbiomecli-darwin-arm64のみ存在する状態です。この状態でnpm installし直すとpackage-lock.jsonにはnode_modules/@biomejs/biomenode_modules/@biomejs/cli-darwin-arm64しか書き込まれないことになります。CI環境ではこのpackage-lock.jsonを使ってnpm ciしていたので、@biomejs/cli-linux-x64がインストールされずbiome checkの実行に失敗していたようです。

対応

原因が分かったので後は簡単です。

一旦node_modulespackage-lock.jsonを削除してnpm installし直しました。これで無事にpackage-lock.jsonnode_modules/@biomejs/cli-linux-x64も書き出されました。

あとは更新後のpackage-lock.jsonをコミット & プッシュしたところ、今度は正常にCIのジョブが完了しました。無事解決です。

まとめ

開発環境がAppleシリコン搭載のMacで、CI環境がx86環境というのはよくある環境だと思います。もしpackage.jsonpackage-lock.jsonのコンフリクト解消後にプラットフォーム依存のパッケージがうまく見つからずにCIやCDのジョブが動かなくなった場合は、この記事を思い出してみてください。

参考

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.